home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Uip / rcvalert / udpsbr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  3.2 KB  |  171 lines

  1. /* udpsbr.c: support routines for the UDP protocol notification stuff */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Uip/rcvalert/RCS/udpsbr.c,v 6.0 1991/12/18 20:39:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Uip/rcvalert/RCS/udpsbr.c,v 6.0 1991/12/18 20:39:41 jpo Rel $
  9.  *
  10.  * $Log: udpsbr.c,v $
  11.  * Revision 6.0  1991/12/18  20:39:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <stdio.h>
  19. #include <isode/internet.h>
  20. #include <sys/types.h>
  21.  
  22. #include "data.h"
  23.  
  24. int    getdata (fd, buf, len, user, from)
  25. int    fd;
  26. char    *buf;
  27. int    *len;
  28. char    *user;
  29. char    *from;
  30. {
  31.     struct data thedata;
  32.     struct data *ds = &thedata;
  33.     struct sockaddr_in sin;
  34.     int    slen = sizeof sin;
  35.     int    retval = 0;
  36.     int    n;
  37.  
  38.     if((n = recvfrom (fd, (char *)ds, sizeof *ds, 0,
  39.               (struct sockaddr *)&sin, &slen)) <= 0 ||
  40.        n != sizeof *ds)
  41.         return retval;
  42.     if ((*len = strlen(ds->data)) > (sizeof ds -> data) )
  43.         *len = sizeof (ds -> data);
  44.     bcopy (ds -> data, buf, *len);
  45.     buf[*len] = 0;
  46.     if ((n = strlen (ds->from)) > (sizeof ds -> from))
  47.         n = sizeof (ds -> from);
  48.     bcopy (ds -> from, from, n);
  49.     from[n] = 0;
  50.     if (checkid (ds, &sin, user))
  51.         retval = 1;
  52.     ack (&sin);
  53.     return retval;
  54. }
  55.  
  56.  
  57. struct ref {
  58.     long    refid;
  59.     u_long    addr;
  60. };
  61. #define MAXREFS    10
  62.  
  63. checkid (ds, sp, user)
  64. struct data *ds;
  65. struct sockaddr_in *sp;
  66. char    *user;
  67. {
  68.     static struct ref refs[MAXREFS];
  69.     static int    cur;
  70.     struct ref *rp;
  71.     int    refid = (int) ntohl(ds->refid);
  72.  
  73.     if (strcmp (user, ds -> user) != 0)
  74.         return 0;
  75.  
  76.     for (rp = refs; rp < &refs[MAXREFS]; rp ++)
  77.         if (rp -> refid == refid &&
  78.             sp -> sin_addr.s_addr == rp -> addr)
  79.             return 0;
  80.  
  81.     rp = &refs[cur];
  82.     rp -> refid = refid;
  83.     rp -> addr = sp -> sin_addr.s_addr;
  84.     cur = (cur + 1) % MAXREFS;
  85.     return 1;
  86. }
  87.  
  88. static short theport;
  89. static int replysock;
  90. char    alertfilename[BUFSIZ];
  91.  
  92. ack (sp)
  93. struct sockaddr_in *sp;
  94. {
  95.     if( sendto (replysock, "ok", 2, 0,
  96.             (struct sockaddr *)sp, sizeof *sp) < 0)
  97.         perror ("sendto");
  98. }
  99.  
  100. udp_start (port, file, home)
  101. short port;
  102. char    *file, *home;
  103. {
  104.     int    s;
  105.     struct sockaddr_in sin;
  106.     int    len;
  107.  
  108.     if ((s = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
  109.         perror ("socket failed");
  110.         exit (1);
  111.     }
  112.     bzero ((char *)&sin, sizeof sin);
  113.     sin.sin_family = AF_INET;
  114.     sin.sin_port = htons(port);
  115.  
  116.     if (bind (s, (struct sockaddr *)&sin, sizeof sin) < 0) {
  117.         perror ("bind failed");
  118.         exit (1);
  119.     }
  120.  
  121.     if ((replysock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
  122.         perror ("socket failed");
  123.         exit (1);
  124.     }
  125.     len = sizeof sin;
  126.     if (getsockname (s, (struct sockaddr *)&sin, &len) == -1) {
  127.         perror ("getsockname");
  128.         exit (1);
  129.     }
  130.         theport = ntohs (sin.sin_port);
  131.     makeredirfile (file, home);
  132.     return s;
  133. }
  134.  
  135.  
  136. makeredirfile (file, home)
  137. char    *file;
  138. char    *home;
  139. {
  140.     FILE    *fp;
  141.     char    hostname[128];
  142.  
  143.     if (gethostname (hostname, sizeof hostname) == -1) {
  144.         perror ("Can't fetch hostname");
  145.         return;
  146.     }
  147.     if (*file == '/' || strncmp (file, "./", 2) == 0 ||
  148.         strncmp (file, "../", 3) == 0)
  149.         (void) strcpy (alertfilename, file);
  150.     else {
  151.         (void) sprintf (alertfilename, "%s/%s",
  152.                 home, file);
  153.     }
  154.  
  155.  
  156.     if ((fp = fopen (alertfilename, "w")) == NULL) {
  157.         perror (alertfilename);
  158.         return;
  159.     }
  160.     fprintf (fp, "%s %d\n", hostname, theport);
  161.     (void) fclose (fp);
  162. }
  163.  
  164. udp_cleanup ()
  165. {
  166.     if (alertfilename[0])
  167.         (void) unlink (alertfilename);
  168.     if (replysock)
  169.         (void) close (replysock);
  170. }
  171.